package com.zsy.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zsy.mapper.EmpMapper;
import com.zsy.mapper.empExprMapper;
import com.zsy.pojo.*;
import com.zsy.service.EmpService;
import com.zsy.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: zhengsuyang
 * @Desc:
 * @create: 2025-08-02 19:01
 **/
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private empExprMapper empExprMapper;


//    /**
//     * 原始分页查询
//     *
//     * @param page     页码
//     * @param pageSize 每页记录数
//     * @return
//     */
    /*@Override
    public PageResult<Emp> page(Integer page, Integer pageSize) {
        // 1. 获取总记录数
        Long total = empMapper.getCount();
        // 2. 获取分页数据
        Integer start = (page - 1) * pageSize;
        List<Emp> rows = empMapper.getEmpByPage(start, pageSize);
        return new PageResult<Emp>(total, rows);
    }*/

//    /**
//     * 根据pageHelper完成分页查询
//     * @param page 页码
//     * @param pageSize 每页记录数
//     * @return
//     * 注意事项：
//     *          1.定义的SQL语句结尾不能加分号 因为PageHelper要对SQL语句进行拼接改造
//     *          2.PageHelper仅仅能对紧跟在其后的第一个查询操作生效
//     */
/*    @Override
    public PageResult<Emp> page(Integer page, Integer pageSize) {
        // 1. 设置分页参数(PageHelper)
        PageHelper.startPage(page,pageSize);
        // 2. 执行查询
        List<Emp> rows = empMapper.list();
        // 3. 解析查询结果，并封装
        PageInfo<Emp> p = new  PageInfo<Emp>(rows);
        System.out.println(rows);
        System.out.println("---------------------");
        System.out.println(p);
        return new PageResult<Emp>(p.getTotal(), p.getList());
    }*/
    @Override
    public PageResult<Emp> page(EmpQueryParam empQueryParam) {
        // 1. 设置分页参数(PageHelper)
        PageHelper.startPage(empQueryParam.getPage(),empQueryParam.getPageSize());
        // 2. 执行查询
        List<Emp> rows = empMapper.findList(empQueryParam);
        // 3. 解析查询结果，并封装
        PageInfo<Emp> p = new PageInfo<Emp>(rows);
        return new PageResult<Emp>(p.getTotal(), p.getList());
    }

    /**
     * 新增员工
     * @param emp
     */
    @Override
    // 什么是事务:一组操作的集合要么同时成功要么同时失败
    // 在项目中怎么控制事务:在方法上添加@Transactional,(可以在类上加不建议)
    // rollbackFor:可以指定出现何种异常类型回滚事务 默认是运行时异常
    @Transactional(rollbackFor = Exception.class)
    public void addEmp(Emp emp) {
        // 1.员工的基本信息
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        emp.setPassword("123456");
        empMapper.addEmp(emp);
        // 2.员工的工作经历
        /*
            前端传递的工作经历字段有company job begin end
            但后端员工经历表必须有emp_id
            需要把当前添加的员工的id获取赋值到当前工作经历表中emp_id ->自增主键回填
         */
        List<EmpExpr> exprList = emp.getExprList();
        if (exprList!=null && exprList.size()>0){
            for (EmpExpr empExpr : exprList) {
                empExpr.setEmpId( emp.getId());
            }
            empMapper.addExpr(exprList);
        }

    }
    /**
     * 批量删除员工
     * @param ids
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteById(List<Integer> ids) {
        //1. 根据ID批量删除员工基本信息
        empMapper.deleteByIds(ids);
        //2. 根据员工的ID批量删除员工的工作经历信息
        empExprMapper.deleteByEmpIds(ids);
    }
    /**
     * 根据id查询员工
     * @param id 员工id
     * @return Emp
     */
    @Override
    public Emp selectEmpById(Integer id) {
        Emp emp = empMapper.selectEmpById(id);
        List<EmpExpr> empExprs = empMapper.selectExprById(id);
        emp.setExprList(empExprs);
        return emp;
    }

    /**
     * 查询所有员工
     *
     * @return
     */
    @Override
    public List<Emp> queryEmpList() {
        List<Emp> emps = empMapper.queryEmpList();
        return emps;
    }

    /**
     * 修改员工
     *
     * @param emp
     */
    @Override
    @Transactional(rollbackFor=Exception.class)
    public void updateEmp(Emp emp) {
        //修改员工
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateEmp(emp);
        // 根据id删除员工经历
        empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
        // 再增加员工经历
        List<EmpExpr> exprList = emp.getExprList();
        if (exprList!=null && exprList.size()>0){
            for (EmpExpr empExpr : exprList) {
                empExpr.setEmpId(emp.getId());
            }
            empExprMapper.addExpr(exprList);
        }

    }

    /**
     * 统计各个职位的员工人数
     *
     * @return
     */
    @Override
    public JobOption getEmpJobData() {
        List<Map<String,Object>> empJobData = empMapper.getEmpJobData();
        List<Object> jobList = empJobData.stream().map(jobData -> jobData.get("jobName")).toList();
        List<Object> totalList = empJobData.stream().map(jobData -> jobData.get("total")).toList();
        return new JobOption(jobList,totalList);
    }

    /**
     * 统计各个性别的员工人数
     *
     * @return
     */
    @Override
    public List<Map> getEmpGenderData() {
        return empMapper.getEmpGenderData();
    }

    /**
     * @param emp
     * @return
     */
    @Override
    public LoginInfo login(Emp emp) {
        LoginInfo loginInfo = empMapper.login(emp);
        if (loginInfo!=null) {
            // 有此用户
            // 创建map集合添加数据
            Map<String,Object> map = new HashMap<>();
            map.put("id",loginInfo.getId());
            map.put("username",loginInfo.getUsername());
            map.put("name",loginInfo.getName());
            // 获取jwt令牌，封装到loginInfo中
            String jwt = JwtUtils.generateJwt(map);
            loginInfo.setToken(jwt);
            return loginInfo;
        }
        else
            // 没有此用户
            return null;
    }
}
